//
//  @ Project : tp1-algo3
//  @ File Name : Carrera.java
//  @ Date : 04/05/2008
//  @ Author : Claudia, Jorge, Luciana, Luciano
//
package modelo.escenario;

import java.util.LinkedList;
//import auto.*;
import modelo.escenario.Calculador;
import modelo.juego.*;
import modelo.jugador.*;


public class Carrera {
	/*Constantes*/
	public static final int INTRO = 0;
	public static final int JUGANDO = 1;
	public static final int FIN = 7;
	public static final int GANO = 8;
	public static final int PERDIO = 9;
	public static final int ROMPIO = 6;
	public static final int DURACION_CARRERA = 90000;
	
	/*ATRIBUTOS*/
	
	//Propiedades relativas al flow del juego
	private int estado;
	private float contador;
	//Propiedades relativas a los elementos del juego
	private Pista pista;
	private int clima;
	private LinkedList<modelo.jugador.Jugador> listaOponentes;
	private JugadorHumano jugador;

	//Objetos auxiliares
	private algo3.core.Timer timer;
	private String mensaje;


	/*GETTERS Y SETTERS*/

	public Jugador getJugador()  { 
		return jugador; 
	}
	
	public String getMensaje() {
		return this.mensaje;
	}
	
	public Pista getPista() {
		return this.pista;
	}	
	
	public void setPista(Pista pista){
		this.pista = pista;
	}
	
	public float getTiempo(){
		return this.contador;
	}
	
	public int getEstado(){
		return this.estado;
	}
	
	public void setClima(int clima){
		this.clima = clima;
	}
	
	public LinkedList<modelo.jugador.Jugador> getOponentes (){
		return listaOponentes;
	}

	
	
	/*METODOS PUBLICOS*/
	
	/**Constructor*/
	public Carrera(Usuario usuario, int nroContrincantes) {
		/*Inicializacion de clases de sistema.*/
		timer = new algo3.core.Timer(30);
		
		/*Inicializacion de la lista de jugadores.*/
		listaOponentes = new LinkedList<Jugador>();
		
		/*Jugador humano*/
		jugador = new JugadorHumano();
		jugador.setAuto(usuario.getAuto());
		
		
		/*Agrego los jugadores oponentes*/
		Calculador.generarComputerPlayers(Escenario.CANTIDAD_OPONENTES, listaOponentes);
		
	
	}
	
	/**Inicializaciones antes de comenzar la carrera*/
	public void inicializar() {
		
		contador = 3000;
		
		double rozamiento = Calculador.calcularRozamiento(clima, pista.getSuperficie());	
		
		for (int i = 0; i < listaOponentes.size(); i++ ) {
			listaOponentes.get(i).getAuto().setRozamiento(rozamiento);
			listaOponentes.get(i).getAuto().reiniciar();
		}
		
		jugador.getAuto().setRozamiento(rozamiento);
		
		jugador.getAuto().reiniciar();
	}
	
	/**Actualizaciones propias de la carrera.
	 * Se encarga de actualizar los datos de cada uno de los jugadores
	 * Tambien muestra el dialogo antes de la carrera y lleva la cuenta del tiempo de carrera*/
	public void actualizar() {
		timer.update(); // Actualizo el timer
		long elapsed = timer.getElapsed();
	
		// 3... 2....1...
		if(estado == INTRO){
			contador -= elapsed;
			
			mensaje = "Comenzando: " + (Math.floor(contador/1000)+1);			
			
			if(contador <= 0){
				contador = 0;
				estado = JUGANDO;			
			}
		}
		else if(estado == JUGANDO){
			mensaje = "Jugando";
			
			contador += elapsed;
			if(contador >= DURACION_CARRERA){
				terminar();
			}
			
			for (int i = 0; i < listaOponentes.size(); i++ ) {
				listaOponentes.get(i).update(elapsed);
				
				if (listaOponentes.get(i).getPosicion() >= pista.getLongitud()){
					
					//System.out.println(listaOponentes.get(i).getPosicion()+"-"+ pista.getLongitud());
					estado = PERDIO;
					
					mensaje = "Perdiste";
				}
			}
			
			if (jugador.getPosicion() >= pista.getLongitud()){
				estado = GANO;
				//
				mensaje = "Ganaste";
			}
			else if (jugador.getAuto().getFactorVelocidad() <= 0){
				estado = ROMPIO;
				//
				mensaje = "Se rompio el auto.";
			}
			
			jugador.update(elapsed);
		}
		
		timer.esperar();
	}
	
	public void terminar() {
		estado = FIN;
		mensaje = "Tiempo Terminado";
	}
	
	
}
